// 封装ajax请求函数
// {url,type,data,dataType,async,fn}
function ajax(obj){
  // 判断url是否传递
  if(!obj.url){
    // 手动抛出错误
    throw Error('url必须传递');
  }
  // 准备一个默认参数的对象
  let Info = {
    type:'get',
    data:{},
    dataType:'string',
    async:true,
    fn:function(res){}
  }
  // 遍历obj,将传递的参数覆盖默认值
  for (const key in obj) {
    Info[key] = obj[key];
  }

  // 拼接请求携带的参数字符串
  let str = '';
  for (const key in Info.data) {
    str += `${key}=${Info.data[key]}&`;
  }
  if(str){ // 如果有参数，最后会多一个&,通过截取的方式去除
    str = str.slice(0,-1); 
  }
  // console.log(str);
  // 1. 创建ajax对象
  let xhr = new XMLHttpRequest();
  // 2. 配置请求信息
  // 3. 发送请求
  if(Info.type==='get'){ // get请求方式
    xhr.open('get',`${Info.url}?${str}`,Info.async);
    xhr.send();
  }else{ // post请求方式
    xhr.open('post',Info.url,Info.async);
    xhr.setRequestHeader('content-type','application/x-www-form-urlencoded');
    xhr.send(str);
  }

  // 4. 接受响应
  xhr.onreadystatechange = function(){
    if(xhr.status == 200 && xhr.readyState == 4){
      let res;
      // 判断期望返回响应的数据格式
      if(Info.dataType=='json'){  // json表示希望返回对象或数组
        res =JSON.parse(xhr.responseText);
      }else{
        res = xhr.responseText;
      }
      // 接收到响应后要执行的函数
      Info.fn(res);
    }
  }



}


// 封装一个promise发起的ajax请求
function pAjax(obj){
  return new Promise((resolve,reject)=>{
    window.resolve = resolve;
    window.reject = reject;
    // ajax请求
    ajax({
      url: obj.url || '',
      type: obj.type || 'get',
      data: obj.data || {},
      dataType: obj.dataType || 'string',
      async: obj.async || true,
      fn: obj.fn || function(res){
        resolve(res);
      }
    })
  })
}
